//
//	bb84.js
//
//	(c) Daniel Bershatsky, 2013
//

BB84 = {
	compareKeys: function(keyA, keyB) {
		var overlaps = 0;

		for (var i = 0; i < keyA.length; i++) {
			overlaps += keyA[i] == keyB[i];
		}

		return overlaps/keyA.length;
	},

	getSideKey: function(qubits, indexes) {
		var key = [];

		for (var i in indexes) {
			key.push(qubits[indexes[i]]["value"]);
		}

		return key;
	},

	compareBasis: function(qubits, bobits) {
		var indexes = [];
		var length = Math.min(qubits.length, bobits.length);
		
		for (var i = 0; i < length; i++) {
			if (qubits[i]["basis"] == bobits[i]["basis"]) {
				indexes.push(i);
			}
		}

		return indexes;
	},

	getQubits: function(length) {
		var basiss = getRandomBitString(length);
		var values = getRandomBitString(length);
		var qubits = [];

		for (var i = 0; i < length; i++) {
			qubits[i] = new Object();
			qubits[i]["basis"] = basiss[i];
			qubits[i]["value"] = values[i];
		}
		
		return qubits;
	},

	mesureQubits: function(qubits, basis) {
		var states = [];
		
		for (var i = 0; i < basis.length; i++) {
			states[i] = new Object();
			states[i]["basis"] = basis[i];
			
			if (basis[i] == qubits[i]["basis"]) {
				states[i]["value"] = qubits[i]["value"];
			}
			else {
				states[i]["value"] = getRandomBit();
			}
		}

		return states;
	},

	getBasis: function(length) {
		return getRandomBitString(length);
	},

	encrypt: function(message, key) {
//		Зашифровывает битовую строку заданным ключом. По умолчанию xor.
		while (message.length > key.length) {
			key = key.concat(key);
		}

		var cipher = [];

		for (var i = 0; i < message.length; i++) {
			cipher[i] = message[i] ^ key[i];
		}
		
		return cipher;
	},

	decrypt: function (cipher, key) {
//		Расшифровывает битовую строку заданным ключом. По умолчанию xor.
		return this.encrypt(cipher, key);
	},

	description: function () {
//		Более детальное описание объекта.
		return "Реализация квантового криптографического алгоритма BB84 http://ru.wikipedia.org/wiki/BB84";
	},

	version: function() {
//		Версия объекта.
		return "BB84 v0.2";
	}
}


